package cn.kgc.mybatis;

import cn.kgc.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author 课工场
 * @date 2024/6/26
 * @description mybatis基本环境的构建
 * 持久层框架    解决数据库操作相关问题
 * 1.导包
 * 2.配置参数
 * 3. 引入mybatis配置文件
 * 1.全局配置     基本环境参数配置
 * XML 配置文件中包含了对 MyBatis 系统的核心设置，包括获取数据库连接实例的数据源（DataSource）
 * 以及决定事务作用域和控制方式的事务管理器（TransactionManager）
 * 2.编写sql语句的xml文件     解决代码耦合问题
 * <p>
 * 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
 * SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
 * 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory实例。
 */
public class TestMyBatis {


    private static SqlSessionFactory factory;

    static {
        // 创建SqlSessionFactoryBuilder  来生成   SqlSessionFactory
        // 加载全局配置文件
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    }

    public static void main(String[] args) throws IOException {

        // List<User> users = selectAll();
        // users.forEach(System.out::println);

        // User user = selectOne();
        // System.out.println("user = " + user);

        // 添加一条数据
        User user = new User();
        user.setPassword("888888");
        user.setId(8);

        // Integer integer = addUser(user,"a.addUser");
        // System.out.println("integer = " + integer);

        // Integer integer = updateUser(user, "a.updateUser");
        // System.out.println("integer = " + integer);


        Integer integer = deleteUser(8, "a.deleteById");
        System.out.println("integer = " + integer);

    }

    //  查询所有数据

    public static List<User> selectAll() {
        /*
         * 既然有了 SqlSessionFactory，顾名思义，我们可以从中获得 SqlSession 的实例。
         * SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
         * */
        //  通过SqlSession 实现数据的相关操作
        SqlSession sqlSession = factory.openSession();
        List<User> usrs = sqlSession.selectList("a.selectAll");

        sqlSession.close();
        return usrs;
    }

    //  查询一条数据
    public static User selectOne() {

        SqlSession sqlSession = factory.openSession();
        //  查询一个用户信息
        User u = sqlSession.selectOne("a.selectOne", 1);
        sqlSession.close();
        return u;
    }

    // 添加一条数据
    public static Integer  addUser(User user,String statement){

        SqlSession sqlSession = factory.openSession();
        int insert = sqlSession.insert(statement, user);

        // 添加数据  默认不会自动提交事务  数据不会持久化    手动提交事务
        sqlSession.commit();
        sqlSession.close();
        return  insert;
    }

    // 修改数据
    public static Integer  updateUser(User user,String statement){

        // 将参数设置为true  则后续sqlSession操作数据库时可以实现事务自动提交
        SqlSession sqlSession = factory.openSession(true);
        int update = sqlSession.update(statement, user);
        sqlSession.close();
        return update;

    }

    public static Integer deleteUser(Integer id,String statement){

        SqlSession sqlSession = factory.openSession(true);
        int delete = sqlSession.delete(statement, id);
        sqlSession.close();
        return  delete;
    }

}
